home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork2.lzh
/
サンプル基礎編
/
ファイル操作
/
FILE.C
next >
Wrap
Text File
|
1994-03-10
|
10KB
|
333 lines
/******************************************************************************
* file.c: ファイル操作の処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <string.h>
#include <doslib.h>
#include <event.h> /* イベントマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "file.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* copyProc(): コピーダイアログの処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: コピー処理成功
* = FALSE: コピー処理失敗
*/
BOOLEAN copyProc(ComVal *pcv)
{
int num, errCode, len, stat;
DlgPrm dp = { /* ダイアログ処理用パラメータ */
2, 16,
"ファイルのコピー",
"コピー元ファイル名",
"コピー先ファイル名"
};
num = dialogProc(pcv, &dp);
if (num == 1) { /* [実行]ボタンか? */
/* コピー元ファイル名をチェックする */
errCode = checkDrive(pcv, (char *) &dp.src[1], 1);
if (errCode < 0) {
if (errCode == -4) /* ファイルが存在しないか? */
pcv->errorCode = -2;
return FALSE;
}
/* コピー先ファイル名をチェックする */
errCode = checkDrive(pcv, (char *) &dp.dst[1], 1);
if (errCode >= 0) { /* ファイルが存在するか? */
num = DMError(D_EXEC, "同名のファイルが存在します。\r"
"上書きしますか?");
if (num == 2)
return TRUE;
} else if (errCode == -4)
errCode = 0;
else
return FALSE;
/* コピー元とコピー先のファイルが同一か? */
len = (dp.src[0] >= dp.dst[0]) ? dp.src[0] : dp.dst[0];
stat = SXStrCmp((char *) &dp.src[1], (char *) &dp.dst[1], len);
if (stat == 0) {
/* 同一ファイルへコピーしようとした */
pcv->errorCode = -22;
return FALSE;
}
/* 待ち状態を示すマウスポインタを表示する */
EMEnCross();
/* コピーする */
errCode = TSCopyP((char *) &dp.src[1], (char *) &dp.dst[1]);
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
if (errCode < 0) {
pcv->errorCode = errCode;
return FALSE;
}
}
return TRUE;
}
/******************************************************************************
* renameProc(): ファイル名変更の処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: ファイル名変更成功
* = FALSE: ファイル名変更失敗
*/
BOOLEAN renameProc(ComVal *pcv)
{
int num, errCode;
DlgPrm dp = { /* ダイアログ処理用パラメータ */
2, 14,
"ファイル名変更",
"変更ファイル名",
"新規ファイル名"
};
num = dialogProc(pcv, &dp);
if (num == 1) {
/* [実行]ボタンで終了 */
/* 変更ファイル名チェック */
errCode = checkDrive(pcv, (char *) &dp.src[1], 1);
if (errCode < 0) {
if (errCode == -4)
/* ファイルが存在しない場合は終了 */
pcv->errorCode = -2;
return FALSE;
}
/* 新規ファイル名チェック */
errCode = checkDrive(pcv, (char *) &dp.dst[1], 1);
if (errCode >= 0) {
/* ファイルが存在する */
pcv->errorCode = -22;
return FALSE;
} else if (errCode == -4)
errCode = 0;
else
return FALSE;
/* 待ち状態を示すマウスポインタを表示する */
EMEnCross();
/* 名前を変更する */
errCode = TSMoveP((char *) &dp.src[1], (char *) &dp.dst[1]);
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
if (errCode < 0) {
pcv->errorCode = errCode;
return FALSE;
}
}
return TRUE;
}
/******************************************************************************
* deleteProc(): ファイル削除の処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: ファイル削除成功
* = FALSE: ファイル削除失敗
*/
BOOLEAN deleteProc(ComVal *pcv)
{
int num, errCode;
char str[64];
char drv[2], path[65], node[19], ext[5];
DlgPrm dp = { /* ダイアログ処理用パラメータ */
1, 12,
"ファイル削除",
"削除ファイル名"
};
num = dialogProc(pcv, &dp);
if (num == 1) {
/* [実行]ボタンで終了 */
/* 変更ファイル名チェック */
errCode = checkDrive(pcv, (char *) &dp.src[1], 1);
if (errCode < 0) {
if (errCode == -4)
/* ファイルが存在しない場合は終了 */
pcv->errorCode = -2;
return FALSE;
}
/* フルパス名よりファイル名だけ抽出 */
strsfn((char *) &dp.src[1], drv, path, node, ext);
sprintf(str, "ファイル %s.%s\rを削除します。\0", node, ext);
/* ファイルの削除の確認 */
num = DMError(D_EXEC, str);
if (num == 2)
return TRUE;
/* 待ち状態を示すマウスポインタを表示する */
EMEnCross();
/* ファイルを削除する */
errCode = TSDeleteP((char *) &dp.src[1]);
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
if (errCode < 0) {
pcv->errorCode = errCode;
return FALSE;
}
}
return TRUE;
}
/******************************************************************************
* mkdirProc(): ディレクトリ作成の処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: ディレクトリ作成成功
* = FALSE: ディレクトリ作成失敗
*/
BOOLEAN mkdirProc(ComVal *pcv)
{
int num, errCode;
DlgPrm dp = { /* ダイアログ処理用パラメータ */
1, 16,
"ディレクトリ作成",
"ディレクトリ名"
};
num = dialogProc(pcv, &dp);
if (num == 1) {
/* [実行]ボタンで終了 */
/* ディレクトリ名チェック */
errCode = checkDrive(pcv, (char *) &dp.src[1], 0x80 + 1);
if (errCode >= 0) {
/* ディレクトリが存在する場合は終了 */
pcv->errorCode = -20;
return FALSE;
} else if (errCode == -4)
errCode = 0;
else
/* その他のエラー */
return FALSE;
/* 待ち状態を示すマウスポインタを表示する */
EMEnCross();
/* ディレクトリを作成する */
errCode = TSMkDirP((char *) &dp.src[1]);
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
if (errCode < 0) {
pcv->errorCode = errCode;
return FALSE;
}
}
return TRUE;
}
/******************************************************************************
* rmdirProc(): ディレクトリ削除の処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: ディレクトリ削除成功
* = FALSE: ディレクトリ削除失敗
*/
BOOLEAN rmdirProc(ComVal *pcv)
{
int num, errCode;
char str[64];
char drv[2], path[65], node[19], ext[5];
DlgPrm dp = { /* ダイアログ処理用パラメータ */
1, 16,
"ディレクトリ削除",
"ディレクトリ名"
};
num = dialogProc(pcv, &dp);
if (num == 1) {
/* [実行]ボタンで終了 */
/* ディレクトリ名チェック */
errCode = checkDrive(pcv, (char *) &dp.src[1], 0x80 + 1);
if (errCode < 0) {
if (errCode == -4)
/* ディレクトリが存在しない場合は終了 */
pcv->errorCode = -3;
return FALSE;
}
/* フルパス名よりファイル名だけ抽出 */
strsfn((char *) &dp.src[1], drv, path, node, ext);
sprintf(str, "ディレクトリ %s\rを削除します。\0", node);
/* ファイルの削除の確認 */
num = DMError(D_EXEC, str);
if (num == 2)
return TRUE;
/* 待ち状態を示すマウスポインタを表示する */
EMEnCross();
/* ディレクトリを削除する */
errCode = TSRmDirP((char *) &dp.src[1]);
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
if (errCode < 0) {
pcv->errorCode = errCode;
return FALSE;
}
}
return TRUE;
}
/******************************************************************************
* checkDrive(): 指定ファイル名のドライブをチェック
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* char *fname ファイル名へのポインタ
* int mode 検査するモード(+0x80 で、ディレクトリの検査)
* = 0: 書き込み
* = 1: 読み込み
* 戻り値: int >= 0: 読み込み成功
* = -1: ファイル名が正しくない
* = -2: ドライブの準備ができていない
* = -3: 書き込み禁止がされている
* = -4: ファイルが存在しない
*/
int checkDrive(ComVal *pcv, char *fname, int mode)
{
int att, stat, errCode;
struct NAMECKBUF nminf;
struct FILBUF filbuf; /* ファイル情報 */
/* ディレクトリとしてチェックするか? */
att = (mode & 0x80) ? TS_SUBDIR : TS_ARCH;
mode &= 1;
/* 入力されたファイル名を分解・検査する */
stat = NAMECK((unsigned char *) fname, &nminf);
if (stat != 0) {
pcv->errorCode = -13; /* ファイル名が正しくない */
return -1;
}
/* フルパス名を作成する */
strmfn(fname, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
/* 指定ファイル名のドライブの状態を取得する */
stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
if ((stat & 0x06) != 0x02) { /* ドライブが準備されているか? */
pcv->errorCode = 15; /* 準備できていない */
return -2;
}
/* ライトプロテクトされているか? */
if (mode == 0 && (stat & 0x0a) == 0x0a) {
pcv->errorCode = 16; /* プロテクトされている */
return -3;
}
/* ファイルの存在のチェック */
errCode = TSFiles(&filbuf, fname, att);
if (errCode < 0)
/* ファイルの新規作成をする場合を考えて、
エラーダイアログは出さない */
return -4;
return 0;
}